package services

import (
	"errors"
	"stacks/database"
	"stacks/models"
)

// RoleService 角色服务
type RoleService struct{}

// NewRoleService 创建角色服务实例
func NewRoleService() *RoleService {
	return &RoleService{}
}

// GetRoleByID 根据ID获取角色
func (s *RoleService) GetRoleByID(id, tenantID uint) (*models.SysRole, error) {
	var role models.SysRole
	err := database.GetDB().Where("id = ? AND tenant_id = ?", id, tenantID).First(&role).Error
	if err != nil {
		return nil, errors.New("角色不存在")
	}
	return &role, nil
}

// GetRoleList 获取角色列表
func (s *RoleService) GetRoleList(tenantID uint, page, pageSize int) ([]models.SysRole, int64, error) {
	var roles []models.SysRole
	var total int64

	db := database.GetDB().Where("tenant_id = ?", tenantID)
	db.Model(&models.SysRole{}).Count(&total)

	offset := (page - 1) * pageSize
	err := db.Offset(offset).Limit(pageSize).Find(&roles).Error
	if err != nil {
		return nil, 0, err
	}

	return roles, total, nil
}

// CreateRole 创建角色
func (s *RoleService) CreateRole(role *models.SysRole) error {
	// 检查角色名是否已存在
	var existingRole models.SysRole
	err := database.GetDB().Where("name = ? AND tenant_id = ?", role.Name, role.TenantID).First(&existingRole).Error
	if err == nil {
		return errors.New("角色名已存在")
	}

	return database.GetDB().Create(role).Error
}

// UpdateRole 更新角色
func (s *RoleService) UpdateRole(id, tenantID uint, updates map[string]interface{}) error {
	var role models.SysRole
	err := database.GetDB().Where("id = ? AND tenant_id = ?", id, tenantID).First(&role).Error
	if err != nil {
		return errors.New("角色不存在")
	}

	// 检查角色名是否重复
	if name, ok := updates["name"].(string); ok {
		var existingRole models.SysRole
		err = database.GetDB().Where("name = ? AND tenant_id = ? AND id != ?", name, tenantID, id).First(&existingRole).Error
		if err == nil {
			return errors.New("角色名已存在")
		}
	}

	return database.GetDB().Model(&role).Updates(updates).Error
}

// DeleteRole 删除角色
func (s *RoleService) DeleteRole(id, tenantID uint) error {
	var role models.SysRole
	err := database.GetDB().Where("id = ? AND tenant_id = ?", id, tenantID).First(&role).Error
	if err != nil {
		return errors.New("角色不存在")
	}

	return database.GetDB().Delete(&role).Error
}

// AssignPermissions 分配权限给角色
func (s *RoleService) AssignPermissions(roleID, tenantID uint, permissionIDs []uint) error {
	// 验证角色存在
	var role models.SysRole
	err := database.GetDB().Where("id = ? AND tenant_id = ?", roleID, tenantID).First(&role).Error
	if err != nil {
		return errors.New("角色不存在")
	}

	// 删除原有权限
	err = database.GetDB().Where("role_id = ?", roleID).Delete(&models.SysRolePermission{}).Error
	if err != nil {
		return err
	}

	// 添加新权限
	for _, permissionID := range permissionIDs {
		rolePermission := models.SysRolePermission{
			TenantModel: models.TenantModel{
				TenantID: tenantID,
			},
			RoleID:       roleID,
			PermissionID: permissionID,
		}
		err = database.GetDB().Create(&rolePermission).Error
		if err != nil {
			return err
		}
	}

	return nil
}
